#!/bin/sh
# jerry.du 2009-01-05 add for task/process context switch statistics

var_status=""
var_pid=""
var_name=""
var_nvcsw=""
var_nivcsw=""
var_ctxt=""
has_mm=""

echo "information of process's context switch"
echo " pid    - process id"
echo " name   - process name "
echo " nvcsw  - voluntary context switch"
echo " nivcsw - nonvoluntary context switch"
echo " tctxt  - total context switch"
echo

echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
printf "%5s%30s%12s%12s%12s" \
	"pid" \
	"name" \
	"nvcsw" \
	"nivcsw" \
	"tctxt"
echo
PROCS=`ls /proc/ | grep '^[0-9]' | sort -g`
#echo $PROCS
for i in $PROCS; do
	#echo "pid $i"
	if [ -d /proc/$i ]; then
		var_status=`cat /proc/$i/status`

		var_pid=$i
		var_name=`cat /proc/$i/stat | cut -d " " -f2`
		has_mm=`echo $var_status | grep VmSize 2>/dev/null`
		if [ -z "$has_mm" ]; then
			var_nvcsw=`echo $var_status | grep voluntary_ctxt_switches | cut -d ":" -f23 | cut -d " " -f2`
			var_nivcsw=`echo $var_status | grep nonvoluntary_ctxt_switches | cut -d ":" -f24 | cut -d " " -f2`
		else
			var_nvcsw=`echo $var_status | grep voluntary_ctxt_switches | cut -d ":" -f33 | cut -d " " -f2`
			var_nivcsw=`echo $var_status | grep nonvoluntary_ctxt_switches | cut -d ":" -f34 | cut -d " " -f2`
		fi
		var_ctxt=`expr $var_nvcsw + $var_nivcsw 2>/dev/null`
		printf "%5d%30s%12d%12d%12d" \
			`echo $var_pid` \
			"`echo $var_name`" \
			`echo $var_nvcsw` \
			`echo $var_nivcsw` \
			`echo $var_ctxt`
		echo
	fi
done
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo 

